/*!
 * 文件名称： main.c
 * 描    述： SPI-SPI NOR FLASH读写实验主函数文件
 * 版本：     2023-12-03, V1.0
*/

/*
* GD32F303东方红开发板V1.0
* 淘宝商城：   https://juwo.taobao.com
* 技术交流：   https://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#include "gd32f30x.h"
#include <stdio.h>
#include "bsp_led.h"
#include "bsp_uart.h"
#include "bsp_spi_nor.h"
#include "driver_public.h"

//读写校验长度
#define BUFFER_SIZE                    1024
#define TX_BUFFER_SIZE                 BUFFER_SIZE
#define RX_BUFFER_SIZE                 BUFFER_SIZE

//demo写入地址
#define  FLASH_WRITE_ADDRESS           0x000000
#define  FLASH_READ_ADDRESS            FLASH_WRITE_ADDRESS

uint8_t  tx_buffer[TX_BUFFER_SIZE];
uint8_t  rx_buffer[TX_BUFFER_SIZE];
uint32_t flash_id = 0;

/*!
* 说明     main函数
* 输入     无
* 输出     无
* 返回值   无
*/
int main(void)
{
    //延时、共用驱动部分初始化 
    driver_init();
          
    //初始化LED组和默认状态
    bsp_led_group_init();
    bsp_led_on(&LED0);
    bsp_led_off(&LED1);     

    //初始化UART打印
    bsp_uart_init(&BOARD_UART);

    //初始化SPI    
    bsp_spi_init(&BOARD_SPI);
  
    //初始化SPI NOR     
    bsp_spi_nor_init();
  
    printf_log("\n\rSPI Flash:GD25Q32E configured...\n\r");

    //读取flash id
    flash_id = bsp_spi_nor_read_id();
    printf_log("\n\rThe Flash_ID:0x%X\n\r",flash_id);

    //比对flash id是否一致
    if(SFLASH_ID == flash_id)
        {
        printf_log("\n\rWrite to tx_buffer:\n\r");

        //准备数据
        for(uint16_t i = 0; i < BUFFER_SIZE; i++){
            tx_buffer[i] = i;
            printf_log("0x%02X ",tx_buffer[i]);
            if(15 == i%16){
                printf_log("\n\r");
            }
        }
        printf_log("\n\r");
        printf_log("\n\rRead from rx_buffer:\n\r");
        
        //擦除要写入的sector
        bsp_spi_nor_sector_erase(FLASH_WRITE_ADDRESS);
        //写入数据 
        bsp_spi_nor_buffer_write(tx_buffer,FLASH_WRITE_ADDRESS,TX_BUFFER_SIZE);

        //延时等待写完成
        delay_ms(10);

        //回读写入数据
        bsp_spi_nor_buffer_read(rx_buffer,FLASH_READ_ADDRESS,RX_BUFFER_SIZE);
        
        /* printf_log rx_buffer value */
        for(uint16_t i = 0; i < BUFFER_SIZE; i++){
            printf_log("0x%02X ", rx_buffer[i]);
            if(15 == i%16){
                printf_log("\n\r");
            }
        }
        printf_log("\n\r");
        //比较回读和写入数据
        if(ERROR == memory_compare(tx_buffer,rx_buffer,BUFFER_SIZE)){
            printf_log("Err:Data Read and Write aren't Matching.\n\r");            
            //写入错误
            /* turn off all leds */
            bsp_led_on(&LED0);
            /* turn off all leds */
            bsp_led_on(&LED1);           
            while(1);
        }else{
            printf_log("\n\rSPI-GD25Q16 Test Passed!\n\r");
        }
    }else{ //ID读取错误
        /* spi flash read id fail */
        printf_log("\n\rSPI Flash: Read ID Fail!\n\r");
        /* turn off all leds */
        bsp_led_on(&LED0);
        /* turn off all leds */
        bsp_led_on(&LED1);           
        while(1);
    }

    while(1){
        /* turn off all leds */
        bsp_led_toggle(&LED0);
        /* turn off all leds */
        bsp_led_toggle(&LED1);        
        delay_ms(200);
    }
}









